package main

/*
os包中有一个Args变量，存放着传递给命令行的全部参数
flag包里面的函数可以帮助处理参数内容
fmt包里面包含格式化io处理，比如Println函数
*/

import (
	"flag"
	"fmt"
	"os"
)

//输入 ch01 -cp com/cj Java.lang.String a b
type Cmd struct {
	helpFlag    bool     //处理 ch01 -help
	versionFlag bool     //处理ch01 -version
	cpOption    string   //类路径（class path）选项
	class       string   //类的完全限定名
	args        []string //传递给java类文件中的main方法的参数
}

/*
此方法返回Cmd类型的引用

*/
func parseCmd() *Cmd {
	//Cmd{}表示初始化一个结构，&Cmd{}表示对初始化结构取地址，这样cmd变量就是一个引用类型了
	cmd := &Cmd{}
	flag.Usage = printUsage
	/*
		设定5个需要解析的项目。
		参数中输入的是-help或者-?时把cmd对象的helpfalg设置为true
		参数中输入classpath或者cp时把后面的值赋值给cmd的cpOption
	*/
	flag.BoolVar(&cmd.helpFlag, "help", false, "print help message")
	flag.BoolVar(&cmd.helpFlag, "?", false, "print help message")
	flag.BoolVar(&cmd.versionFlag, "version", false, "print version and exit")
	flag.StringVar(&cmd.cpOption, "classpath", "", "classpath")
	flag.StringVar(&cmd.cpOption, "cp", "", "classpath")

	flag.Parse() //开始解析，解析失败会调用flag的Usage函数输出

	//flag.args可以捕获其它没有被解析的参数
	args := flag.Args() //创建了变量args，并动态赋值（:=)

	//fmt.Print("----help",cmd.helpFlag)
	//输入myjvmimpl -cp com/cj Java.lang.String a b，cmd的
	// cpOption为com/cj,
	// class为java.lang.String,
	// args为[a,b]

	if len(args) > 0 {
		cmd.class = args[0]
		cmd.args = args[1:]
	}
	return cmd
}

func printUsage() {
	//这里的os.Args[0]返回的就是当前运行的程序完整名字（路径+名字）
	//os.Args[0]为程序的名字（包含路径）
	fmt.Printf("用法为: %s [-options] class [args...]\n", os.Args[0])
}
